package com.jiexinyun.ftp;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

@Slf4j
@Component
public class FTPDirectoryLister {

    @Value("${ftp.host}")
    private String host;

    @Value("${ftp.port}")
    private int port;

    @Value("${ftp.username}")
    private String username;

    @Value("${ftp.password}")
    private String password;

    @Value("${file.prefix}")
    private String prefixlink;

    public List<String> listFiles(String remotePath) {
        List<String> list = new ArrayList<>();
        FTPClient ftpClient = new FTPClient();

        try {
//            String remotePath = "/工艺图纸/北方汽修/0014"; // 要查询的目录路径
            // 1. 连接到FTP服务器
            ftpClient.connect(host, port);

            // 2. 登录
            if (!ftpClient.login(username, password)) {
                throw new IOException("FTP登录失败");
            }

            // 3. 设置被动模式（推荐）
            ftpClient.enterLocalPassiveMode();

            // 4. 设置文件类型（二进制模式防止文件损坏）
            ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);

            // 5. 处理中文编码（根据服务器设置）
//            ftpClient.setControlEncoding("UTF-8"); // 或GBK
            ftpClient.setControlEncoding("GBK"); // 或GBK
            // 2. 关键编码设置
            ftpClient.enterLocalPassiveMode();
            ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);

            // 3. 处理中文路径
//            String encodedPath = new String(remotePath.getBytes("UTF-8"), "ISO-8859-1");
            String encodedPath = new String(remotePath.getBytes("GBK"), "ISO-8859-1");

            FTPFile[] files = ftpClient.listFiles(encodedPath);

            log.info("直接列出文件数量: " + files.length);

            for (FTPFile file : files) {
                log.info(file.getName());
                if(file.isDirectory()) {
                    continue;
                }
                // 跳过当前目录(.)和上级目录(..)
                // file跳过目录类型
                list.add(prefixlink+remotePath+"/"+file.getName());
            }
            //list是我最终想要的结果
            log.info("文件列表：: " + list);
        } catch (IOException e) {
            log.error("发生错误: " + e.getMessage(), e);
        } finally {
            try {
                // 8. 登出并断开连接
                if (ftpClient.isConnected()) {
                    ftpClient.logout();
                    ftpClient.disconnect();
                }
            } catch (IOException e) {
                log.error(e.getMessage(), e);
            }
        }
        return list;
    }


    /**
     * 目录带中文 文件名也允许带中文
     * @param args
     */
    public static void main(String[] args) {
        String host = "192.168.0.118";
        int port = 21;
        String username = "ftptest";
        String password = "dell@2025";
        String remotePath = "/工艺图纸/北方汽修/0014"; // 要查询的目录路径
//        String remotePath = "/"; // 要查询的目录路径

        FTPClient ftpClient = new FTPClient();

        try {
            // 1. 连接到FTP服务器
            ftpClient.connect(host, port);

            // 2. 登录
            if (!ftpClient.login(username, password)) {
                throw new IOException("FTP登录失败");
            }

            // 3. 设置被动模式（推荐）
            ftpClient.enterLocalPassiveMode();

            // 4. 设置文件类型（二进制模式防止文件损坏）
            ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);

            // 5. 处理中文编码（根据服务器设置）
//            ftpClient.setControlEncoding("UTF-8"); // 或GBK
            ftpClient.setControlEncoding("GBK"); // 或GBK
            // 2. 关键编码设置
//            ftpClient.setControlEncoding("UTF-8");  // 设置控制通道编码
            ftpClient.enterLocalPassiveMode();
            ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);

            // 3. 处理中文路径
//            String encodedPath = new String(remotePath.getBytes("UTF-8"), "ISO-8859-1");
            String encodedPath = new String(remotePath.getBytes("GBK"), "ISO-8859-1");

            FTPFile[] files = ftpClient.listFiles(encodedPath);



//            System.out.println(ftpClient.printWorkingDirectory());
//            FTPFile[] files = ftpClient.listFiles(remotePath);
           System.out.println("直接列出文件数量: " + files.length);
//            FTPFile[] files=null;
//            if (ftpClient.changeWorkingDirectory(remotePath)) {
//                System.out.println(ftpClient.printWorkingDirectory());
//                System.out.println("成功切换到目录: " + remotePath);
//                files = ftpClient.listFiles();
//                System.out.println("找到文件数量: " + files.length);
//            } else {
//                System.out.println("无法切换到目录: " + remotePath);
//                System.out.println("服务器返回: " + ftpClient.getReplyString());
//            }

            List<String> list = new ArrayList<>();

            for (FTPFile file : files) {
                System.out.println(file.getName());
                if(file.isDirectory()) {
                    continue;
                }
                // 跳过当前目录(.)和上级目录(..)
                // file跳过目录类型
                list.add(file.getName());
            }

            //list是我最终想要的结果
            System.out.println(list);

//            System.out.println(ftpClient.printWorkingDirectory());
            /*
            System.out.println("服务器响应: " + ftpClient.getReplyString());
            System.out.println(ftpClient.printWorkingDirectory());
            boolean f1 = ftpClient.changeWorkingDirectory("工艺图纸");
            System.out.println("服务器响应: " + ftpClient.getReplyString());

            System.out.println(ftpClient.printWorkingDirectory());
            boolean f2 = ftpClient.changeWorkingDirectory("北方汽修");
            System.out.println(ftpClient.printWorkingDirectory());
            boolean f3 = ftpClient.changeWorkingDirectory("0014");
            System.out.println(ftpClient.printWorkingDirectory());

//            // 6. 获取所有文件名（递归）
//            List<String> allFiles = listAllFiles(ftpClient, remotePath);
//
//            // 7. 输出结果
//            System.out.println("找到 " + allFiles.size() + " 个文件:");
//            for (String file : allFiles) {
//                System.out.println(file);
//            }
/*
             */

        } catch (IOException e) {
            log.error("发生错误: " + e.getMessage(), e);
        } finally {
            try {
                // 8. 登出并断开连接
                if (ftpClient.isConnected()) {
                    ftpClient.logout();
                    ftpClient.disconnect();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
